package org.example.inoke;

import java.lang.reflect.Method;

/**
 * @Classname Dept
 * @Description 类反射调用方法
 * @Date 2020/11/26 12:28 下午
 * @Created by xiangjd
 */
public class Dept {
    public String show(String name) {// 用反射的方法来调用正常的方法
        return name + "，您好！";
    }

    private void privateshow() {// 用反射来实现对私有化方法的调用
        System.out.println("privateshow");
    }

    public static void staticshow() {
        System.out.println("staticshow");
    }
}

class Bsgrid {
    public static void main(String[] args) throws Exception {
        // }
        /*
         * 传统方式： String name = new Dept().show("刘昭"); System.out.println(name);
         *//**
         * * Method getMethod(String name, Class<?>... parameterTypes) 返回一个
         * Method 对象，它反映此 Class 对象所表示的类或接口的指 定公共成员方法。 name - 方法名 parameterTypes
         * - 参数列表
         */
        // 想要通过反射来调用Dept中的方法
        Class<Dept> c = Dept.class;
        Method m = c.getMethod("show", String.class);
        Object o = m.invoke(c.newInstance(), "刘昭");
        System.out.println(o);
        // 私有化的方法
        m = c.getDeclaredMethod("privateshow");
        // 无参方法
        m.setAccessible(true);
        o = m.invoke(c.newInstance());
        // 静态方法的调用
        m = c.getMethod("staticshow");
        m.invoke(null);// staticshow为静态方法，不需创建对象，所以这里会是null

        //打印结果
        //刘昭，您好！
        //privateshow
        // staticshow
    }
}
